package com.creative.util;

import android.util.Base64;

import java.security.MessageDigest;

/**
 * Created by yinjialiang on 15-2-14.
 */
public class EncodeUtil {
    private static final String ALGORITHM = "MD5";
    private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    /**
     * encode string
     *
     * @param algorithm
     * @param str
     * @return String
     */
    public static String encode(String algorithm, String str) {
        if (str == null) {
            return null;
        }
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * encode By MD5
     *
     * @param str
     * @return String
     */
    public static String encodeByMD5(String str) {
        if (str == null) {
            return null;
        }
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM);
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * Takes the raw bytes from the digest and formats them correct.
     *
     * @param bytes
     *            the raw bytes from the digest.
     * @return the formatted bytes.
     */
    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        // 把密文转换成十六进制的字符串形式
        for (int j = 0; j < len; j++) { 			buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }

    /**
     * 按照既定规则进行BASE64 加密
     * @param s
     * @return
     */
//    public static synchronized String encryptByBase64(String s)
//    {
//        if(s==null){
//            return null;
//        }
//        if(s.length()<4){
//            for(int i=0;i<4-s.length();i++){
//                s+="x";
//            }
//        }
//        try {
//            String _s = new String(Base64.encode(s.getBytes(), Base64.DEFAULT)).replace('+', '-').replace('/', '_');
//            for(int i=0;i<_s.length();i++){
//                int _lastIndex=_s.lastIndexOf('=');
//                if(_lastIndex>=0){
//                    _s=_s.substring(0,_lastIndex-1);
//                }
//                else{
//                    break;
//                }
//            }
//            String _part1=_s.substring(0,4);
//            String _part2=_s.substring(4);
//            _s=_part2+_part1;
//            _s = new String(Base64.encode(_s.getBytes(), Base64.DEFAULT)).replace('+', '-').replace('/', '_');
//            for(int i=0;i<_s.length();i++){
//                int _lastIndex=_s.lastIndexOf('=');
//                if(_lastIndex>=0){
//                    _s=_s.substring(0,_lastIndex);
//                }
//                else{
//                    break;
//                }
//            }
//
//            return _s;
//
//        } catch (Exception e) {
//            e.printStackTrace();
//            // TODO: handle exception
//            return null;
//        }
//    }

    /**
     * 按照既定规则进行BASE64 加密
     * @param s
     * @return
     */
    public static synchronized String encryptByBase64(String s)
    {
        if(s==null){
            return null;
        }
        if(s.length()<4){
            for(int i=0;i<4-s.length();i++){
                s+="x";
            }
        }
        try {
            String _s = new String(Base64.encode(s.getBytes(), Base64.NO_WRAP));

            _s = _s.replace('+', '-').replace('/', '_');

            for(int i=0;i<_s.length();i++){
                int _lastSpaceIndex=_s.lastIndexOf(' ');
                if(_lastSpaceIndex>=0
                        &&_lastSpaceIndex==_s.length()-1){
                    _s=_s.substring(0,_lastSpaceIndex);
                }

                int _lastIndex=_s.lastIndexOf('=');
                if(_lastIndex>=0&&_lastIndex==_s.length()-1){
                    _s=_s.substring(0,_lastIndex);
                }
            }

            String _part1=_s.substring(0,4);

            String _part2=_s.substring(4);

            _s=_part2+_part1;
            _s = new String(Base64.encode(_s.getBytes(), Base64.NO_WRAP)).replace('+', '-').replace('/', '_');

            for(int i=0;i<_s.length();i++){
                int _lastSpaceIndex=_s.lastIndexOf(' ');
                if(_lastSpaceIndex>=0
                        &&_lastSpaceIndex==_s.length()-1){
                    _s=_s.substring(0,_lastSpaceIndex);
                }

                int _lastIndex2=_s.lastIndexOf('=');
                if(_lastIndex2>=0&&_lastIndex2==_s.length()-1){
                    _s=_s.substring(0,_lastIndex2);
                }
            }

            return _s;

        } catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
            return null;
        }
    }
}
